/*!
 * myznala.js
 * 
 *  tetsuya_odaka (EzoGP)
 * 
 * (C) 2009, EzoGP.
 * $Id: syracava-1.0-min.js 455 2009-04-08 08:54:14Z tetsuya_odaka $
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*****************************************************************
 * クライアントサイドでの入力検証オブジェクト。
 * 
 *  （クロージャーパターンで実装）
 * 
 * @author
 *     Tetsuya Odaka  ( EzoGP )<br>
 * 
 ****************************************************************/
var MyValidator = function() {
    
    /*
     * 検証コンポーネント識別子テーブル（英語）
     * 		必要に応じて利用時に書き換えできます。
     */
    this.valMsg = {
    	isRequired	:"required",
    	isAlpha		:"alphabetic characters only",
    	isCapAlpha	:"capital alphabetic characters only",
        isNum		:"number only.",
        isAlphaNum	:"alphanumeric characters only",
        isDate		:"invalid date format. yyyy/mm/dd only.",
        isEmail		:"invalid e-mail format.",
        isPhone		:"invalid phone format",
        isInteger	:"integer only.",
        isZip		:"invalid zip format. 123-4567 or 1234567.",
        // 以下は、return用のみメッセージ
        falseKey	:"invalid key",
        falseUse	:"invalid call"
    };

    /*
     * 検証コンポーネント識別子テーブル（日本語）
     * 		必要に応じて利用時に書き換えできます。
     */
    this.valMsgJp = {
    	isRequired	:"入力必須です.",
    	isAlpha		:"アルファベットでなくてはいけません.",
    	isCapAlpha	:"アルファベット（大文字）でなくてはいけません.",
        isNum		:"数値でなくてはいけません.",
        isAlphaNum	:"英数文字でなくてはいけません.",
        isDate		:"日付（yyyy/mm/dd）が正しくありません.",
        isEmail		:"メイルアドレスの形式が正しくありません.",
        isPhone		:"電話番号の形式が正しくありません.",
        isInteger	:"整数でなくてはいけません.",
        isZip		:"郵便番号の形式（123-4567,1234567）が正しくありません.",
        isHiragana	:"ひらがなで入力してください.",
        isKatakana	:"カタカナで入力してください.",
        // 以下は、return用のみメッセージ
        falseKey	:"システムエラー；キーが誤っています.",
        falseUse	:"システムエラー；呼び出しが誤っています."
    };
    
    /*
     * 検証コンポーネント正規表現テーブル
     * 		必要に応じて利用時に書き換えできます。
     */
    this.valRex = {
    	isRequired	:/[^.*]/, // key（isRequired）だけ使う
       	isAlpha		:/^[a-z\s\._-]+$/i,
       	isCapAlpha	:/^[A-Z\s\._-]+$/,
        isNum		:/^[-+]?\d*\.?\d+$/,
        isAlphaNum	:/^[a-z0-9\s\._-]+$/i,
        isDate		:/^\d{4}\/(\d{1}|\d{2})\/(\d{1}|\d{2})/, // yyyy/mm/dd
        isEmail		:/^[a-z0-9\._%-]+@[a-z0-9\.-]+\.[a-z]{2,4}$/i,
        isPhone		:/^[\d\s()-]+$/,
        isInteger	:/^[-+]?\d+$/,
        isZip		:/^\d{3}-?\d{4}$/,
        isHiragana	:/^[あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽヴぁぃぅぇぉゃゅょっ　]+$/,
        isKatakana	:/^[アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴァィゥｪｫャｭョッ　]+$/
    };

   /**
     * 検証を実行するメソッド
     * 
     * @param
     *     		_locale;	クライアントのロケール
     *     		_key; 		検証の内容を表すもの。
     *     		_string; 	検証対象。
     * @return
     * 			_rArray;	エラー配列（エラーなしのときは長さ0）
     */
    this.validate = function(_locale,_keys,_string){
    	
    	// inputエレメントのclass属性（スペース区切り）を配列化
    	var _kArray = _keys.split(' ');
    	
    	// localeからメッセージ配列名を生成する。
		var _mArrayNam = this.valMsg;
    	if(_locale.match(/.*(ja|jp).*/i)){
			 _mArrayNam = this.valMsgJp; 
		}
    	
    	var _rArray = new Array();
    	// 配列化できなかったら、「呼び出しエラー」にする.
    	if(_kArray<1){
			_rArray[_key] = _mArrayNam['falseUse']; 
    		// 終了
    		return _rArray;
    	}
    	
    	// 取り出したキーそれぞれについて、検証を行う。
    	for(_i in _kArray){
    		
    		var _key = _kArray[_i];

    		// タブとスペースを取り除く
    		_string.replace(/[\t\s]+$/,'');
    	
    		// isRequiredの場合、未入力のチェック
    		if(_key == "isRequired"){
    			if(_string == null || _string.length < 1){
   	   				_rArray[_key] = _mArrayNam['isRequired']; 
    			}
    		}else{
    			// isRequired以外の場合、正規表現でエラー検出
    			if(!_string.match(this.valRex[_key])){
   					_rArray[_key] = _mArrayNam[_key]; 
    			}
    		}
    	
    		/* 
    		 * 連想配列でチェックするのが面倒なものの処理
    		 */
    		// カレンダーのチェック
    		if(_key == 'isDate'){
    			var _year 	= _string.substr(0, 4);
    			var _month 	= _string.substr(5, 2)-1; 
    			var _day 	= _string.substr(8, 2);
    			// 月,日の妥当性チェック
    			if(_month >= 0 && _month <= 11 && 
    					_day >= 1 && _day <= 31){
    				var _date = new Date(_year, _month, _day);
    				// エラー	
    				if(isNaN(_date)){
       					_rArray[_key] = _mArrayNam[_key];
    				}
   				// エラー	
    			}else{
   					_rArray[_key] = _mArrayNam[_key]; 
    			}
    		}
    	}
    	return _rArray;
    };
    
    /* 自身の参照値を返却 */
    return this;
};

/****************************************************************
 * クライアントサイドでのコンバートオブジェクト。
 * 
 *  （クロージャーパターンで実装）
 * 
 * @author
 *     Tetsuya Odaka  ( EzoGP )<br>
 *     
 * modified		2009/5/25	t.odaka	化けそうな文字を追加
 * 
 ***************************************************************/
var MyConverter = function() {

	// 禁止文字のregex
	this.illegalCharsReg =/[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ㈱㈲㎝㎏～]/g;
	// 禁止文字の羅列
	this.illegalChars ='①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ㈱㈲㎝㎏～';
	// 置換文字の配列
	this.legalChars = new Array(
		1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
		1,2,3,4,5,6,7,8,9,10,
		1,2,3,4,5,6,7,8,9,10,
		'（株）','（有）','cm','kg','-'
	);
	
	/**
     * 禁則処理を行うメソッド
     *	禁止文字を■で置き換える。
     * 
     * @param
     *     		_str; 	置換対象の文字列
     * @return
     * 			置換後の文字列
     */

     this.convertIllegal = function(_str){
		// コンバート
		return _str.replace(this.illegalCharsReg,'??');
    };
    
	/**
     * 禁則処理を行うメソッド
     *	禁止文字を、適当な文字列で置き換える。
     * 
     * @param
     *     		_str; 	置換対象の文字列
     * @return
     * 			置換後の文字列
     */
    this.convertToRegalChar = function(_str){

		//文字列から置換する文字を取り出す
    	var _mArr = _str.match(this.illegalCharsReg);

		if(_mArr){
			//置換する文字に対応する、legalなCharを配列に入れる。
    		var _pArr = new Array();
    		for(var i=0; i < _mArr.length; i++){
        		var _place = this.illegalChars.indexOf(_mArr[i],0);
	        	_pArr.push(this.legalChars[_place]);
    		}

	    	//順に置換していく
    		for(var i=0; i < _mArr.length; i++){
				// 動的にregexを作るには、RegExpを使った方が無難。
	    		var _rStr = new RegExp(String(_mArr[i]),"g");
    	    	_str = _str.replace(_rStr, _pArr[i]);
	    	}
		}
    	return _str;
    };
    
    /* 自身の参照値を返却 */
    return this;
};

/* powered by Eclipse Ganymede, designed by EzoGP Project. */